home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / amiga / sipp.lha / sipp / demo / isy90.c < prev    next >
C/C++ Source or Header  |  1993-03-13  |  4KB  |  168 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. #include <sipp.h>
  5. #include <shaders.h>
  6. #include <primitives.h>
  7.  
  8.  
  9. #define BEZ_RES        9
  10. #define CYL_RES        40
  11. #define LID_ROT        1.5
  12. #define BLOCK_SIZE     1.2
  13. #define NCYL           16
  14. #define CYL_LEN        5.0
  15. #define SMALL_CYL_RAD  ((BLOCK_SIZE * M_PI) / (NCYL * 2))
  16. #define BIG_CYL_RAD    (0.5 * BLOCK_SIZE - 1.1 * SMALL_CYL_RAD)
  17.  
  18.  
  19. Marble_desc teapot_surf = {
  20.     0.4, 
  21.     0.5,
  22.     0.05,
  23.     8.0, 
  24.     {0.90, 0.80, 0.65}, 
  25.     {0.30, 0.08, 0.08}, 
  26.     {1.0, 1.0, 1.0}
  27. };
  28.  
  29. Granite_desc column_surf = {
  30.     0.4,
  31.     0.1,
  32.     0.4,
  33.     20.0,
  34.     {0.647, 0.565, 0.5},
  35.     {0.15, 0.12, 0.10}, 
  36.     {1.0, 1.0, 1.0}
  37. };
  38.  
  39. extern char *optarg;
  40.  
  41. main(argc, argv)
  42.     int argc;
  43.     char **argv;
  44. {
  45.     Object  *column;
  46.     Object  *teapot;
  47.     Object  *handle;
  48.     Object  *spout;
  49.     Object  *body;
  50.     Object  *lid;
  51.     Object  *tmp;
  52.     FILE    *infile;
  53.     FILE    *image;
  54.     int      i;
  55.  
  56.     char    *imfile_name;
  57.     int      mode;
  58.     int      c;
  59.     int      size;
  60.  
  61.     imfile_name = "isy90.ppm";
  62.     mode = PHONG;
  63.     size = 256;
  64.  
  65.     while ((c = getopt(argc, argv, "pgfls:")) != EOF) {
  66.         switch (c) {
  67.           case 'p':
  68.             mode = PHONG;
  69.             imfile_name = "isy90.ppm";
  70.             break;
  71.  
  72.           case 'g':
  73.             mode = GOURAUD;
  74.             imfile_name = "isy90.ppm";
  75.             break;
  76.  
  77.           case 'f':
  78.             mode = FLAT;
  79.             imfile_name = "isy90.ppm";
  80.             break;
  81.  
  82.           case 'l':
  83.             mode = LINE;
  84.             imfile_name = "isy90.pbm";
  85.             break;
  86.  
  87.           case 's':
  88.             size = atoi(optarg);
  89.             break;
  90.         }
  91.     }
  92.  
  93.     sipp_init();
  94.     sipp_shadows(TRUE, ((size<512)?2*size:size));
  95.  
  96.     infile = fopen("tpt_handle.bez", "r");
  97.     handle = sipp_bezier_file(infile, BEZ_RES, &teapot_surf, marble_shader,
  98.                               WORLD); 
  99.     fclose(infile);
  100.  
  101.     infile = fopen("tpt_spout.bez", "r");
  102.     spout = sipp_bezier_file(infile, BEZ_RES, &teapot_surf, marble_shader,
  103.                              WORLD); 
  104.     fclose(infile);
  105.  
  106.     infile = fopen("tpt_body.bez", "r");
  107.     body = sipp_bezier_file(infile, BEZ_RES, &teapot_surf, marble_shader,
  108.                             WORLD); 
  109.     fclose(infile);
  110.  
  111.     infile = fopen("tpt_lid.bez", "r");
  112.     lid = sipp_bezier_file(infile, BEZ_RES, &teapot_surf, marble_shader,
  113.                            WORLD); 
  114.     fclose(infile);
  115.  
  116.     object_rot_z(lid, LID_ROT);
  117.  
  118.     teapot = object_create();
  119.     object_add_subobj(teapot, body);
  120.     object_add_subobj(teapot, lid);
  121.     object_add_subobj(teapot, handle);
  122.     object_add_subobj(teapot, spout);
  123.  
  124.     object_add_subobj(sipp_world, teapot);
  125.  
  126.     column = object_create();
  127.     tmp = sipp_block(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE / 4.0, 
  128.                      &column_surf, granite_shader, WORLD);
  129.     object_move(tmp, 0.0, 0.0, -BLOCK_SIZE / 8.0);
  130.     object_add_subobj(column, tmp);
  131.  
  132.     for (i = 0; i < NCYL; i++) {
  133.         if (i == 0) {
  134.             tmp = sipp_cylinder(SMALL_CYL_RAD, CYL_LEN, CYL_RES,
  135.                                 &column_surf, granite_shader, WORLD); 
  136.         } else {
  137.             tmp = object_instance(tmp);
  138.         }
  139.         object_move(tmp, BIG_CYL_RAD * cos(i * 2.0 * M_PI / NCYL), 
  140.                     BIG_CYL_RAD * sin(i * 2.0 * M_PI / NCYL), 
  141.                     -0.5 * (CYL_LEN + BLOCK_SIZE / 4.0));
  142.         object_add_subobj(column, tmp);
  143.     }
  144.  
  145.     object_add_subobj(sipp_world, column);
  146.         
  147.     lightsource_create(-3.0, -3.0, 6.0, 0.35, 0.35, 0.35, LIGHT_DIRECTION);
  148.     spotlight_create(-3.0, -3.0, 6.0,  
  149.                      0.0, 0.0, 0.0, 
  150.                      25.0, 
  151.                      0.45, 0.45, 0.45, 
  152.                      SPOT_SHARP, TRUE);
  153.  
  154.     camera_position(sipp_camera, 2.0, -4.0, 1.5);
  155.     camera_look_at(sipp_camera, 0.0, 0.0, 0.1);
  156.     camera_up(sipp_camera, 0.0, 0.0, 1.0);
  157.     camera_focal(sipp_camera, 0.2);
  158.  
  159.     printf("Rendering, wait...");
  160.     fflush(stdout);
  161.  
  162.     image = fopen(imfile_name, "w");
  163.     render_image_file(size, size, image, mode, 3);
  164.     printf("Done.\n");
  165.  
  166.     exit(0);
  167. }
  168.